<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>指令</title>
    <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="/VUE/vue2.js"></script>
</head>
<body>
<div id="box">
    <label>
        <input v-focus type="text">
    </label>

    <div v-color="'skyblue'">skyblue</div>
    <div v-color="whichColor">whichColor</div>

</div>
<script>
    // 自定义指令：为了操作底层dom
    // 实际应用 -- 可以通过指令知道bom什么时候创建完成，从而进行 依赖dom库的初始化工作

    // 注册一个全局自定义指令 `v-focus`
    Vue.directive('focus', {
        // 被绑定的元素只有第一次插入到 DOM 中时,才触发
        inserted(el, binding) {
            // 聚焦元素
            el.focus()
            console.log("inserted", el, binding)
        },
    })

    Vue.directive("color", {
        inserted(el, binding) {
            console.log(el, binding)
            el.style.background = binding.value
        },

        // 指令生命周期
        // update,更新时触发
        update(el, binding) {
            el.style.background = binding.value
        }
    })

    let vm = new Vue({
        el: "#box",
        data: {
            whichColor: "orange"
        }
    })

    /*
        一个指令定义对象可以提供如下几个钩子函数(生命周期) (均为可选)：

            bind：只调用一次，指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。  -->  类比组件生命周期：created

            inserted：被绑定元素插入父节点时调用 (仅保证父节点存在，但不一定已被插入文档中)。  -->  类比组件生命周期：mounted

            update：所在组件的 VNode 更新时调用，但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变，也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。   -->  类比组件生命周期：beforeUpdate

            componentUpdated：指令所在组件的 VNode 及其子 VNode 全部更新后调用。   -->  类比组件生命周期：updated

            unbind：只调用一次，指令与元素解绑时调用。  -->  类比组件生命周期：destroyed
     */

</script>
</body>
</html>